function mountComponent(vnode, container, anchor) {
    const componentOptions = vnode.type
    const {
        render,
        data
    } = componentOptions
    // 调用 data 函数得到原始数据，并调用 reactive 函数将其包装为响应式数据
    const state = reactive(data())

    // 将组件的 render 函数调用包装到 effect 内
    effect(() => {
            // 调用 render 函数时，将其 this 设置为 state，
            // 从而 render 函数内部可以通过 this 访问组件自身状态数据
            const subTree = render.call(state, state)
            patch(null, subTree, container, anchor)
        },
        // 指定该副作用函数的调度器为 queueJob 即可
        {
            scheduler: queueJob
        })

}

// 任务缓存队列，用一个 Set 数据结构来表示，这样就可以自动对任务进行去重
const queue = new Set()
// 一个标志，代表是否正在刷新任务队列
let isFlushing = false
// 创建一个立即 resolve 的 Promise 实例
const p = Promise.resolve()

// 调度器的主要函数，用来将一个任务添加到缓冲队列中，并开始刷新队列
function queueJob(job) {
    // 将 job 添加到任务队列 queue 中
    queue.add(job)
    // 如果还没有开始刷新队列，则刷新之
    if (!isFlushing) {
        // 将该标志设置为 true 以避免重复刷新
        isFlushing = true
        // 在微任务中刷新缓冲队列
        p.then(() => {
            try {
                // 执行任务队列中的任务
                queue.forEach(job => job())
            } finally {
                // 重置状态
                isFlushing = false
                queue.clear = 0
            }
        })
    }
}